﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using QuanLyHocPhi.BLL;
using QuanLyHocPhi.GUI.DuLieu;
using QuanLyHocPhi.Model;

namespace QuanLyHocPhi.GUI
{
    /// <summary>
    /// TODO:
    /// - Bổ sung chức năng xem thông tin nộp học phí của sinh viên
    /// </summary>
    public partial class FormTruong : FormBase
    {
        private string m_SelectMaTruongAsLoadingList;

        public FormTruong(string selectMaTruongAsLoadingList = null)
        {
            InitializeComponent();
            #region Danh sách trường
            cbxTruong.DisplayMember = "TenTruong";
            cbxTruong.ValueMember = "MaTruong";
            #endregion

            #region Danh sách lớp
            gridLop.AllowUserToAddRows = false;
            gridLop.AllowUserToDeleteRows = false;
            gridLop.ReadOnly = true;
            gridLop.AutoGenerateColumns = false;
            colLop_MaLop.DataPropertyName = "MaLop";
            colLop_TenLop.DataPropertyName = "TenLop";
            bsLop.DataSource = null;
            gridLop.DataSource = bsLop;
            #endregion

            #region Danh sách sinh viên
            colSinhVien_MaSinhVien.DataPropertyName = "MaSinhVien";
            colSinhVien_HoDem.DataPropertyName = "HoDem";
            colSinhVien_Ten.DataPropertyName = "Ten";
            colSinhVien_GioiTinh.DataPropertyName = "GioiTinh";
            colSinhVien_NgaySinh.DataPropertyName = "NgaySinh";
            colSinhVien_HeSoMienGiam.DataPropertyName = "HeSoMienGiam";
            gridSinhVien.AutoGenerateColumns = false;
            gridSinhVien.ReadOnly = true;
            gridSinhVien.AllowUserToAddRows = false;
            gridSinhVien.AllowUserToDeleteRows = false;
            bsSinhVien.DataSource = null;
            gridSinhVien.DataSource = bsSinhVien;
            #endregion

            m_SelectMaTruongAsLoadingList = selectMaTruongAsLoadingList;
        }

        #region Trường đang chọn
        private Truong SelectedTruong
        {
            get
            {
                if (bsTruong.DataSource == null)
                    return null;
                if (bsTruong.Current == null)
                    return null;
                return bsTruong.Current as Truong;
            }
        }

        private string SelectedMaTruong
        {
            get
            {
                if (SelectedTruong == null)
                    return null;
                else
                    return SelectedTruong.MaTruong;
            }
        }
        #endregion

        #region Lớp đang chọn
        /// <summary>
        /// Lớp không chuyên đang chọn
        /// </summary>
        private Lop SelectedLop
        {
            get
            {
                if (bsLop.DataSource == null)
                    return null;
                if (bsLop.Current == null)
                    return null;
                return bsLop.Current as Lop;
            }
        }

        /// <summary>
        /// Mã lớp không chuyên đang chọn
        /// </summary>
        private string SelectedMaLop
        {
            get
            {
                var selectedLop = this.SelectedLop;
                if (SelectedLop != null)
                    return selectedLop.MaLop;
                else
                    return null;
            }
        }
        #endregion

        /// <summary>
        /// Năm tuyển sinh đang chọn
        /// </summary>
        private string SelectedNamTuyenSinh
        {
            get
            {
                if (cbxNamTuyenSinh.SelectedItem == null)
                    return null;
                else
                    return cbxNamTuyenSinh.SelectedItem.ToString();
            }
        }

        private void OnLoad(object sender, EventArgs e)
        {
            this.LockUpdate();
            NapDanhSachTruong(m_SelectMaTruongAsLoadingList);
            CapNhatTrangThaiControlChoTruongDangChon();
            NapDanhSachNamTuyenSinh(null);
            NapDanhSachLop(null);
            NapThongTinLopKhongChuyen();
            this.UnlockUpdate();
        }

        /// <summary>
        /// Nạp danh sách trường
        /// </summary>
        /// <param name="maTruongToFocus">mã trường được highlight sau khi nạp danh sách trường xong</param>
        private void NapDanhSachTruong(string maTruongToFocus)
        {
            var lstTruong = BizTruong.GetList_Truong();
            bsTruong.DataSource = lstTruong;
            cbxTruong.DataSource = bsTruong;

            if (maTruongToFocus.IsNullOrEmpty() == false)
            {
                for (int i = 0; i < lstTruong.Count; i++)
                    if (lstTruong[i].MaTruong == maTruongToFocus)
                    {
                        bsTruong.Position = i;
                        break;
                    }
            }
        }

        /// <summary>
        /// Nạp danh sách năm tuyển sinh của trường đang chọn
        /// </summary>
        /// <param name="namTuyenSinhToFocus"></param>
        private void NapDanhSachNamTuyenSinh(string namTuyenSinhToFocus)
        {
            string maTruong = this.SelectedMaTruong;
            if (maTruong.IsNullOrEmpty())
            {
                cbxNamTuyenSinh.DataSource = null;
            }
            else
            {
                List<string> lstNamTuyenSinh = BizTruong.GetList_NamTuyenSinh(maTruong);
                cbxNamTuyenSinh.DataSource = lstNamTuyenSinh;
                if (namTuyenSinhToFocus != null)
                    for (int i = 0; i < lstNamTuyenSinh.Count; i++)
                        if (lstNamTuyenSinh[i] == namTuyenSinhToFocus)
                        {
                            cbxNamTuyenSinh.SelectedIndex = i;
                            break;
                        }
            }
        }

        #region Thêm, xoá, sửa trường thành viên
        private void OnAdd_TruongClick(object sender, EventArgs e)
        {
            Truong newTruong = BizTruong.GetNew_Truong();
            FormTruong_Details frm = new FormTruong_Details(isAdding: true, pTruong: newTruong);
            if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                NapDanhSachTruong(newTruong.MaTruong);
            }
        }

        private void OnEdit_TruongClick(object sender, EventArgs e)
        {
            Truong selectedTruong = this.SelectedTruong;
            if (selectedTruong != null)
            {
                var frm = new FormTruong_Details(isAdding: false, pTruong: selectedTruong);
                if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    NapDanhSachTruong(selectedTruong.MaTruong);
                }
            }
        }

        private void OnDelete_TruongClick(object sender, EventArgs e)
        {
            Truong selectedTruong = this.SelectedTruong;
            if (selectedTruong != null)
            {
                if (DialogUtils.ShowYesNo("Bạn có chắc chắn muốn xoá dữ liệu về trường {0} không?", selectedTruong.TenTruong)
                    != System.Windows.Forms.DialogResult.Yes)
                    return;
                try
                {
                    BizTruong.Delete_Truong(selectedTruong);
                    bsTruong.RemoveCurrent();
                }
                catch (Exception exc)
                {
                    DialogUtils.ShowError(exc.Message);
                }
            }
        }
        #endregion

        #region Hiển thị thông tin của lớp không chuyên, danh sách sinh viên
        private void OnBsLopCurrentChanged(object sender, EventArgs e)
        {
            if (m_LockUpdate)
                return;
            NapThongTinLopKhongChuyen();
        }

        private void NapThongTinLopKhongChuyen()
        {
            Lop lop = this.SelectedLop;

            // Cập nhật trạng thái cho entity Lop đang chọn
            btnLop_Sua.Enabled = btnLop_Xoa.Enabled = panelSinhVien.Enabled = lop != null;

            // Nạp thông tin sinh viên thuộc lớp đang chọn
            IList<SinhVien> lstSinhVien = null;
            if (lop == null)
            {
                lblLop_ThongKeSoSinhVien.Text = "";
            }
            else
            {
                lstSinhVien = BizLopGoc.GetListSinhVien(lop.MaLop);
            }
            bsSinhVien.DataSource = lstSinhVien;
            lblLop_ThongKeSoSinhVien.Text = string.Format("Danh sách có {0} sinh viên", bsSinhVien.Count);
        }
        #endregion

        /// <summary>
        /// Nạp danh sách lớp gốc của trường, trong năm tuyển sinh đang chọn
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnBtnLop_Reload_Click(object sender, EventArgs e)
        {
            m_LockUpdate = true;
            NapDanhSachTruong(this.SelectedMaTruong);
            NapDanhSachNamTuyenSinh(this.SelectedNamTuyenSinh);
            NapDanhSachLop(this.SelectedMaLop);
            NapThongTinLopKhongChuyen();
            m_LockUpdate = false;
        }

        #region Thêm, xoá, sửa thông tin Lớp gốc
        private void OnAdd_LopClick(object sender, EventArgs e)
        {
            string namTuyenSinh = this.SelectedNamTuyenSinh;
            if (namTuyenSinh.IsNullOrEmpty())
                namTuyenSinh = DateTime.Now.Year.ToString();
            Lop newLop = BizTruong.GetNew_LopKhongChuyen(
                this.SelectedTruong.MaTruong,
                namTuyenSinh);
            FormLop_Details frm = new FormLop_Details(isAdding: true, pLop: newLop);
            if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                // Nạp danh sách trường, năm tuyển sinh, danh sách lớp tương ứng
                this.LockUpdate();
                NapDanhSachTruong(newLop.MaTruong);
                NapDanhSachNamTuyenSinh(newLop.NamTuyenSinh.ToString());
                NapDanhSachLop(newLop.MaLop);
                NapThongTinLopKhongChuyen();
                this.UnlockUpdate();
            }
        }

        private void OnEdit_LopClick(object sender, EventArgs e)
        {
            Lop selectedLop = this.SelectedLop;
            if (selectedLop != null)
            {
                FormLop_Details frm = new FormLop_Details(isAdding: false, pLop: selectedLop);
                if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    // Nạp danh sách trường, năm tuyển sinh, danh sách lớp tương ứng
                    this.LockUpdate();
                    NapDanhSachTruong(selectedLop.MaTruong);
                    NapDanhSachNamTuyenSinh(selectedLop.NamTuyenSinh.ToString());
                    NapDanhSachLop(selectedLop.MaLop);
                    NapThongTinLopKhongChuyen();
                    this.UnlockUpdate();
                }
            }
        }

        private void OnDelete_LopClick(object sender, EventArgs e)
        {
            Lop lop = this.SelectedLop;
            if (lop != null)
            {
                try
                {
                    BizTruong.Delete_LopKhongChuyen(lop);
                    btnLop_NapLai.PerformClick();
                }
                catch (Exception exc)
                {
                    DialogUtils.ShowError(exc.Message);
                }
            }
        }
        #endregion

        private void OnGridLopCellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.SelectedLop != null && e.RowIndex >= 0)
                btnLop_Sua.PerformClick();
        }

        private void OnCbxNamTuyenSinhSelectedIndexChanged(object sender, EventArgs e)
        {
            if (m_LockUpdate)
                return;
            this.LockUpdate();
            NapDanhSachLop(null);
            NapThongTinLopKhongChuyen();
            this.UnlockUpdate();
        }

        /// <summary>
        /// Nạp danh sách lớp thuộc trường trong năm tuyển sinh cụ thể
        /// </summary>
        /// <param name="maTruong"></param>
        /// <param name="namTuyenSinh"></param>
        private void NapDanhSachLop(string maLopToFocus)
        {
            string maTruong = this.SelectedMaTruong;
            string namTuyenSinh = this.SelectedNamTuyenSinh;

            if (maTruong.IsNullOrEmpty() || namTuyenSinh.IsNullOrEmpty())
                bsLop.DataSource = null;
            else
            {
                var lstLop = BizTruong.GetList_LopKhongChuyen(maTruong, Convert.ToInt32(namTuyenSinh));
                bsLop.DataSource = lstLop;
                if (maLopToFocus.IsNullOrEmpty() == false)
                {
                    for (int i = 0; i < lstLop.Count; i++)
                        if (lstLop[i].MaLop == maLopToFocus)
                        {
                            bsLop.Position = i;
                            break;
                        }
                }
            }

            #region Binding dữ liệu danh sách lớp
            gridLop.DataSource = bsLop;
            lblTruong_ThongKeSoLop.Text = string.Format("Danh sách có {0} lớp", bsLop.Count);
            #endregion
        }

        private void CapNhatTrangThaiControlChoTruongDangChon()
        {
            menuTruong_Sua.Enabled =
                menuTruong_Xoa.Enabled =
                menuTruong_ImportSinhVien.Enabled =
                panelLop.Enabled = this.SelectedTruong != null;

        }

        private void OnBsTruongCurrentChanged(object sender, EventArgs e)
        {
            if (m_LockUpdate)
                return;
            CapNhatTrangThaiControlChoTruongDangChon();
            m_LockUpdate = true;
            NapDanhSachNamTuyenSinh(this.SelectedNamTuyenSinh);
            NapDanhSachLop(this.SelectedLop != null ? this.SelectedLop.MaLop : null);
            NapThongTinLopKhongChuyen();
            m_LockUpdate = false;
        }

        private void OnSinhVien_XoaClick(object sender, EventArgs e)
        {
            SinhVien selectedSinhVien = this.SelectedSinhVien;
            if (selectedSinhVien == null)
                return;
            try
            {
                BizSinhVien.Delete_SinhVien(selectedSinhVien);
                NapThongTinLopKhongChuyen();
            }
            catch (Exception exc)
            {
                DialogUtils.ShowError(exc.Message);
            }
        }

        private void OnSinhVien_SuaClick(object sender, EventArgs e)
        {
            SinhVien selectedSinhVien = this.SelectedSinhVien;
            if (selectedSinhVien == null)
                return;
            DuLieu.FormSinhVienKhongChuyen_Details frm = new DuLieu.FormSinhVienKhongChuyen_Details(selectedSinhVien, false);
            frm.ShowDialog();
            frm = null;
            NapThongTinLopKhongChuyen();
        }

        private SinhVien SelectedSinhVien
        {
            get
            {
                if (bsSinhVien.Current == null)
                    return null;
                return bsSinhVien.Current as SinhVien;
            }
        }

        private void OnBsSinhVienCurrentChanged(object sender, EventArgs e)
        {
            SinhVien selectedSinhVien = this.SelectedSinhVien;
            btnSinhVien_Sua.Enabled = btnSinhVien_Xoa.Enabled = selectedSinhVien != null;
        }

        private void OnGridSinhVienCellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0 && this.SelectedSinhVien != null)
                btnSinhVien_Sua.PerformClick();
        }

        private void OnSinhVien_BoSungClick(object sender, EventArgs e)
        {
            Lop selectedLop = this.SelectedLop;
            SinhVien sv = new SinhVien
            {
                MaLoai = SinhVien.MaLoai_KhongChuyen,
                KC_MaLop = selectedLop != null ? selectedLop.MaLop : null
            };
            GUI.DuLieu.FormSinhVienKhongChuyen_Details frm = new DuLieu.FormSinhVienKhongChuyen_Details(sv, isAddingNew: true);
            if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                NapThongTinLopKhongChuyen();
            }
        }

        private void OnGridSinhVienDataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            foreach (DataGridViewRow row in gridSinhVien.Rows)
            {
                SinhVien sv = row.DataBoundItem as SinhVien;
                if (sv == null)
                    return;
                int daNopHocPhi = 0;
                foreach (var thongTinDangKy in sv.LopHocPhan_SinhVienCollection)
                    if (thongTinDangKy.MaPhieuThu.IsNullOrEmpty() == false||thongTinDangKy.HeSoMienGiam==1)
                        daNopHocPhi++;
                DataGridViewTextBoxCell cell = row.Cells[colSinhVien_ThongKeHocPhi.Index] as DataGridViewTextBoxCell;
                cell.Value = string.Format("{0}/{1}", daNopHocPhi, sv.LopHocPhan_SinhVienCollection.Count);
                if (daNopHocPhi < sv.LopHocPhan_SinhVienCollection.Count)
                {
                    cell.Style.ForeColor = cell.Style.SelectionForeColor = Color.Red;
                }
            }
        }

        private void OnSelectedTruongMouseEnter(object sender, EventArgs e)
        {
            lblSelectedTruong.ForeColor = Color.Red;
        }

        private void OnSelectedTruongMouseLeave(object sender, EventArgs e)
        {
            lblSelectedTruong.ForeColor = SystemColors.MenuText;
        }

        private void OnBsSinhVienListChanged(object sender, ListChangedEventArgs e)
        {
            lblLop_ThongKeSoSinhVien.Text = string.Format("Danh sách có {0} sinh viên", bsSinhVien.Count);
        }

        private void OnBsLopListChanged(object sender, ListChangedEventArgs e)
        {
            lblTruong_ThongKeSoLop.Text = string.Format("Danh sách có {0} lớp", bsLop.Count);
        }

        /// <summary>
        /// Nạp danh sách sinh viên từ các file Excel
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnMenuTruong_ImportSinhVienClick(object sender, EventArgs e)
        {

        }

        private void OnLnkImportDataLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Truong truong = this.SelectedTruong;
            if (truong == null)
                return;
            DuLieu.FormSinhVienKhongChuyen_Import frm = new DuLieu.FormSinhVienKhongChuyen_Import(truong);
            if (this.WindowState == FormWindowState.Maximized)
                this.WindowState = FormWindowState.Maximized;
            else
                frm.Size = this.Size;
            frm.ShowDialog();
            m_SelectMaTruongAsLoadingList = this.SelectedMaTruong;
            OnLoad(null);
        }

        private void chuyenButton_Click(object sender, EventArgs e)
        {
            //Thực hiện chuyển danh sách sinh viên của một lớp sang lớp khác (Lớp gốc)
            Lop lop = this.SelectedLop;
            if (lop != null)
            {
                try
                {
                    GUI.DuLieu.SelectLopSinhHoatDialog frm =
                        new SelectLopSinhHoatDialog(lop);
                    if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        Lop lopMoi = frm.SelectedLop;
                        if (lop == null)
                            return;
                        //m_SinhVien.KC_MaLop = lop.MaLop;
                        //Chuyển danh sách sinh viên của lớp cũ (lop) sang lớp mới (lopMoi)
                        var danhSachSinhVien = BizSinhVien.GetListSinhVienKhongChuyen(lop.MaLop);
                        foreach (var sinhVien in danhSachSinhVien)
                        {
                            sinhVien.KC_MaLop = lopMoi.MaLop;
                            BizSinhVien.Edit_SinhVienKhongChuyen(sinhVien);
                        }
                        MessageBox.Show("Đã chuyển lớp thành công cho " + danhSachSinhVien.Count.ToString() + " sinh viên." , "Thông báo", MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);
                    }
                   
                }
                catch
                {

                }
            }
        }
    }
}
